import { GraphicType } from "../const/GraphicType"
import { logWarn } from "./Log";


//矢量数据集合（按类型）
let GraphicClass = {}

/**
 * 是否有指定类型矢量对象
 * @param {String} type 矢量数据类型
 * @returns {Boolean} 是否有指定类型
 */
export function hasType(type) {
  if (GraphicClass[type]) {
    return true
  } else {
    return false
  }
}

/**
 * 注册矢量数据类
 *
 * @export
 * @param {String} type 矢量数据类型
 * @param {BaseGraphic} graphicClass 矢量数据类
 * @return {void}  无
 */
export function register(type, graphicClass) {
  if (GraphicClass[type]) {
    throw new Error(`register Graphic: ${type}类型已存在`, graphicClass)
  }
  GraphicType[type] = type
  GraphicClass[type] = graphicClass

  graphicClass.prototype._type = type
}

/**
 * 根据 矢量数据类型 获取 矢量数据类
 * @param {String} type 矢量数据类型
 * @returns {BaseGraphic|undefined} 矢量数据类
 */
export function getClass(type) {
  if (GraphicClass[type]) {
    return GraphicClass[type]
  } else {
    logWarn('getClass:未找到该类型对应的处理类', type)
    return null
  }
}

/**
 * 根据类型和参数 创建Graphic工厂方法
 *
 * @export
 * @param {Object} type 数据类型
 * @param {Object} options 构造参数， 按type支持{@link graphic#~GraphicType}类的构造方法参数
 * @return {BaseGraphic} 创建完成的矢量数据对象
 */
export function createGraphic(type, options) {
  let ThisGraphic = getClass(type)
  if (!ThisGraphic) {
    return
  }

  let graphic = new ThisGraphic(options)
  return graphic
}